#include <stdio.h>
#include<stdlib.h>
struct cell { //单链表结点结构体定义
 int x;
 struct cell* next;
};
struct cell* build(void) { //新建单链表，并将建好的单链表首结点地址返回
 struct cell* head,*tmp,*p;
 head= tmp = p = NULL;
 int n;
 scanf("%d",&n);
 while(n!=0){
    tmp=(struct cell*)malloc(sizeof(struct cell));
    tmp->x=n;
    
   tmp->next=NULL;
   if(head==NULL){
    head=tmp;
   }else{
    p->next=tmp;
   }
   p=tmp;
   scanf("%d",&n);
 }
 return head;//返回单链表头
}
int a[20000];
void print(struct cell* head) {//打印整个单链表,head是指向单链表首结点的指针
 /*请在以下位置补充完整，实现函数print的功能
       ......
       ......
       ......
   */
  struct cell * a=head;
  while(a!=NULL){
    printf("%d ",a->x);
    a=a->next;
  }
}
struct cell* mid(struct cell* head) {
int n=0;
struct cell* a=head;
while(a!=NULL){
    n++;
    a=a->next;
}
a=head;
if(n%2){
for(int i=1;i<=n/2;i++){
    a=a->next;
}
}
else {
    for(int i=1;i<n/2;i++){
    a=a->next;
}
}
return a;
}

void release(struct cell* head) {//释放单链表空间,head是指向单链表首结点的指针
 /*请在以下位置补充完整，实现函数release的功能
       ......
       ......
       ......
   */
  struct cell * a=head;
  while(a!=NULL){
    a=a->next;
    free(head);
    head=a;
  }
}
struct cell* del2one(struct cell* head) {//删除重复结点只保留一个，head是单链表首结点指针
 /*请在以下位置补充完整，实现函数del2one的功能
       ......
       ......
       ......
   */
 struct cell * a;
 a=head;
 while(a!=NULL){
    struct cell * b=a->next;
    struct cell * c=a;
    while(b!=NULL){
        if(a->x==b->x){
            c->next=b->next;
            free(b);
            b=c->next;
        }
        else {
            c=c->next;
        b=b->next;
        }
    }
    a=a->next;
 }
 return head;//返回删除重复结点的单链表头
}
int main(void) {
 struct cell* head,*half;
 head = build();
 half = mid(head);
 if(half!=NULL)
        print(half);
    else
        printf("NULL");
 release(head);
 return 0;
}